129bb10ea1516f7b9d29a390a200f5d45cfb3060,src/freenet/store/BerkeleyDBFreenetStore.java,BerkeleyDBFreenetStore,overwriteLRUBlock,#number[]#number[]#Transaction#DatabaseEntry#number[]#,1492
Before Change
fcWriteStore(storeBlock.getOffset(), header, data);
fcWriteLRU( storeBlock.getOffset(),storeBlock.recentlyUsed);
if (keysRAF != null)
fcWriteKey(storeBlock.getOffset(), fullKey);
synchronized (this) {
writes++;
}
After Change
}
}
private void overwriteLRUBlock(byte[] header, byte[] data, Transaction t, DatabaseEntry routingkeyDBE, byte[] fullKey) throws DatabaseException, IOException {
// Overwrite an other block
Cursor c = accessTimeDB.openCursor(t,null);
StoreBlock oldStoreBlock;
try {
DatabaseEntry keyDBE = new DatabaseEntry();
DatabaseEntry dataDBE = new DatabaseEntry();
c.getFirst(keyDBE,dataDBE,LockMode.RMW);
oldStoreBlock = (StoreBlock) storeBlockTupleBinding.entryToObject(dataDBE);
c.delete();
} finally {
c.close();
}
// Deleted, so we can now reuse it.
// Because we acquired a write lock, nobody else has taken it.
// FIXME if this fails we can leak the block??
StoreBlock storeBlock = new StoreBlock(this, oldStoreBlock.getOffset());
DatabaseEntry blockDBE = new DatabaseEntry();
storeBlockTupleBinding.objectToEntry(storeBlock, blockDBE);
keysDB.put(t,routingkeyDBE,blockDBE);
synchronized(storeRAF) {
storeRAF.seek(storeBlock.getOffset()*(long)(dataBlockSize+headerBlockSize));
storeRAF.write(header);
storeRAF.write(data);
lruRAF.seek(storeBlock.getOffset() * 8);
lruRAF.writeLong(storeBlock.recentlyUsed);
if(keysRAF != null) {
keysRAF.seek(storeBlock.getOffset() * keyLength);
keysRAF.write(fullKey);
}
writes++;
}